package dao;

import java.util.List;
import modelo.Recurso;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import util.HibernateUtil;

public class RecursoDAOHibernate implements RecursoDAO {

    @Override
    public boolean criar(Recurso recurso) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            sessao.save(recurso);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public Recurso pesquisar(String nome) {
        Recurso modelo = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Query consultaDescricao = sessao.createQuery("from Recurso r where r.nome like :nome");
            consultaDescricao.setString("nome", "%" + nome + "%");
            modelo = (Recurso) consultaDescricao.uniqueResult();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return modelo;
    }

    @Override
    public List<Recurso> listar() {
        List<Recurso> lista = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        String sql = "from Recurso";
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            lista = sessao.createQuery(sql).list();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return lista;
    }

    @Override
    public boolean alterar(Recurso recurso) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Recurso recursoDB = (Recurso) sessao.load(Recurso.class, recurso.getNome());
            recursoDB.setObservacao(recurso.getObservacao());
            recursoDB.setTipo(recurso.getTipo());
            recursoDB.setEstado(recurso.getEstado());
            sessao.update(recursoDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public boolean excluir(Recurso recurso) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Recurso recursoDB = (Recurso) sessao.load(Recurso.class, recurso.getNome());
            sessao.delete(recursoDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

}
